6418
931
Ответы на этот вопрос являются результатом усилий сообщества. Отредактируйте существующие ответы, чтобы улучшить этот пост. В настоящее время он не принимает новые ответы или взаимодействия.
Я неправильно написал в сообщении о коммите.
Как я могу изменить сообщение? Коммит еще не отправлен. 
Изменение самого последнего сообщения фиксации
git commit --amend
откроет ваш редактор, что позволит вам изменить сообщение о самой последней фиксации. Кроме того, вы можете установить сообщение фиксации прямо в командной строке с помощью:
git commit --amend -m "Новое сообщение фиксации"
… Однако это может сделать многострочные сообщения фиксации или небольшие исправления более громоздкими для ввода.
Перед этим убедитесь, что у вас нет внесенных изменений в рабочую копию, иначе они тоже будут зафиксированы. (Неустановленные изменения не фиксируются.)
Изменение сообщения коммита, который вы уже отправили в удаленную ветку
Если вы уже отправили коммит в свою удаленную ветку, то - после внесения изменений в коммит локально (как описано выше) - вам также необходимо принудительно отправить коммит с помощью:
git push <удаленный> <ветка> --force
# Или
git push <удаленный> <ветка> -f
Предупреждение: принудительное нажатие перезапишет удаленную ветку с состоянием вашей локальной. Если в удаленной ветке есть коммиты, которых нет в вашей локальной ветке, вы потеряете эти коммиты.
Предупреждение: будьте осторожны при внесении изменений в коммиты, которыми вы уже поделились с другими людьми. Внесение изменений в коммиты по существу переписывает их, чтобы они имели другие идентификаторы SHA, что создает проблему, если у других людей есть копии старого коммита, который вы переписали. Любой, у кого есть копия старого коммита, должен будет синхронизировать свою работу с вашим недавно переписанным коммитом, что иногда может быть сложно, поэтому убедитесь, что вы координируете свои действия с другими при попытке переписать общую историю коммитов, или просто избегайте переписывания общих коммитов. все вместе.
Выполните интерактивную перебазировку
Другой вариант - использовать интерактивную перебазировку.
Это позволяет вам редактировать любое сообщение, которое вы хотите обновить, даже если это не последнее сообщение.
Чтобы сделать сквош Git, выполните следующие действия:
// n - количество коммитов до последнего коммита, который вы хотите редактировать
git rebase -i HEAD ~ n
Как только вы раздавите свои коммиты - выберите e / r для редактирования сообщения:
Важное примечание об интерактивном перебазировании
Когда вы используете git rebase -i HEAD ~ n, может быть более n коммитов. Git «соберет» все коммиты в последних n коммитах, и если где-то между этим диапазоном произошло слияние, вы также увидите все коммиты, поэтому результат будет n +.
Хороший совет:
Если вам нужно сделать это для более чем одной ветки и вы можете столкнуться с конфликтами при изменении содержимого, настройте git rerere и позвольте Git разрешить эти конфликты автоматически.
Документация
git-commit (1) Страница руководства
git-rebase (1) Страница руководства
git-push (1) Страница руководства
|
git commit --amend -m "ваше новое сообщение"
|
Если фиксация, которую вы хотите исправить, не самая последняя:
git rebase --interactive $ parent_of_flawed_commit
Если вы хотите исправить несколько ошибочных коммитов, передайте родительский элемент самого старого из них.
Появится редактор со списком всех коммитов, начиная с того, что вы дали.
Измените pick на reword (или в старых версиях Git для редактирования) перед любыми коммитами, которые вы хотите исправить.
После сохранения Git воспроизведет перечисленные коммиты.
Для каждого коммита, который вы хотите переформулировать, Git вернет вас обратно в ваш редактор. Для каждого коммита, который вы хотите отредактировать, Git помещает вас в оболочку. Если вы в оболочке:
Измените фиксацию как хотите.
git commit --amend
git rebase - продолжить
Большая часть этой последовательности будет объяснена вам по ходу выполнения различных команд. Это очень просто; вам не нужно его запоминать - просто помните, что git rebase --interactive позволяет исправлять коммиты независимо от того, как давно они были.
Обратите внимание, что вы не захотите изменять уже отправленные вами коммиты. Или, может быть, вы это сделаете, но в этом случае вам придется очень внимательно общаться со всеми, кто, возможно, вытащил ваши коммиты и проделал работу поверх них. Как мне восстановить / повторно синхронизировать после того, как кто-то нажмет на перебазирование или сброс на опубликованную ветку?
|
Чтобы исправить предыдущую фиксацию, внесите нужные изменения и выполните эти изменения, а затем запустите
git commit --amend
В вашем текстовом редакторе откроется файл, представляющий ваше новое сообщение фиксации. Он начинается с текста из вашего старого сообщения фиксации. Измените сообщение фиксации по своему усмотрению, затем сохраните файл и выйдите из редактора, чтобы закончить.
Чтобы изменить предыдущую фиксацию и сохранить то же сообщение журнала, запустите
git commit --amend -C HEAD
Чтобы исправить предыдущую фиксацию, полностью удалив ее, запустите
git reset --hard HEAD ^
Если вы хотите отредактировать более одного сообщения фиксации, запустите
git rebase -i HEAD ~ commit_count
(Замените commit_count числом коммитов, которые вы хотите отредактировать.) Эта команда запускает ваш редактор. Отметьте первую фиксацию (ту, которую вы хотите изменить) как «редактировать» вместо «выбрать», затем сохраните и выйдите из редактора. Внесите изменения, которые хотите зафиксировать, а затем запустите
git commit --amend
git rebase - продолжить
Примечание. Вы также можете «Внести нужные изменения» в редакторе, открываемом командой git commit --amend
|
Как ужеКак уже упоминалось, git commit --amend - это способ перезаписать последний коммит. Одно замечание: если вы хотите также перезаписать файлы, команда будет
git commit -a --amend -m "Мое новое сообщение фиксации"
|
Вы также можете использовать для этого git filter-branch.
git filter-branch -f --msg-filter "sed 's / errror / error /'" $ flawed_commit..HEAD
Это не так просто, как тривиальный git commit --amend, но он особенно полезен, если у вас уже есть несколько слияний после вашего ошибочного сообщения о фиксации.
Обратите внимание, что это попытается переписать каждую фиксацию между HEAD и ошибочной фиксацией, поэтому вы должны очень разумно выбирать команду msg-filter ;-)
|
Я предпочитаю такой способ:
git commit --amend -c <идентификатор фиксации>
В противном случае будет новая фиксация с новым идентификатором фиксации.
|
Если вы используете инструмент с графическим интерфейсом пользователя Git, есть кнопка «Изменить последнюю фиксацию». Нажмите на эту кнопку, и тогда отобразятся ваши последние файлы фиксации и сообщение. Просто отредактируйте это сообщение, и вы можете зафиксировать его с новым сообщением фиксации.
Или используйте эту команду из консоли / терминала:
git commit -a --amend -m "Мое новое сообщение фиксации"
|
Вы можете использовать Git rebase. Например, если вы хотите изменить обратно, чтобы зафиксировать bbc643cd, запустите
$ git rebase bbc643cd ^ - интерактивный
В редакторе по умолчанию измените 'pick' на 'edit' в строке, фиксацию которой вы хотите изменить. Внесите изменения, а затем выполните их с помощью
$ git add 
Теперь вы можете использовать
$ git commit --amend
чтобы изменить фиксацию, а после этого
$ git rebase - продолжить
чтобы вернуться к предыдущей фиксации головы.
|
Если вы хотите изменить только последнее сообщение о фиксации, выполните:
git commit --amend
Вы попадете в текстовый редактор и сможете изменить последнее сообщение фиксации.
Если вы хотите изменить последние три сообщения фиксации или любое из сообщений фиксации до этого момента, укажите HEAD ~ 3 команде git rebase -i:
git rebase -i ГОЛОВКА ~ 3
|
Если вам нужно изменить старое сообщение фиксации в нескольких ветках (т.е. фиксация с ошибочным сообщением присутствует в нескольких ветках), вы можете использовать:
git filter-branch -f --msg-filter \
'sed "s / <старое сообщение> / <новое сообщение> / g"' - --all
Git создаст временный каталог для перезаписи и дополнительного резервного копирования старых ссылок в refs / original /.
-f принудительно выполнит операцию. Это необходимо, если временный каталог уже существует или уже есть ссылки, хранящиеся в refs / original. Если это не так, вы можете сбросить этот флаг.
- отделяет параметры ветвления фильтра от параметров редакции.
--all обеспечит перезапись всех веток и тегов.
Благодаря резервному копированию ваших старых ссылок вы можете легко вернуться в состояние до выполнения команды.
Скажем, вы хотите восстановить своего мастера и получить к нему доступ в ветке old_master:
git checkout -b old_master refs / original / refs / heads / master
|
Использовать
git commit --amend
Чтобы разобраться в этом подробно, отличный пост - 4. Переписываем историю Git. Также здесь говорится о том, когда не следует использовать git commit --amend.
|
Если это ваша последняя фиксация, просто измените фиксацию:
git commit --amend -o -m "Новое сообщение фиксации"
(Использование флага -o (--only), чтобы убедиться, что вы изменяете только сообщение фиксации)
Если это скрытая фиксация, используйте потрясающую интерактивную перебазировку:
git rebase -i @ ~ 9 # Показать последние 9 коммитов в текстовом редакторе
Найдите нужную фиксацию, измените pick на r (reword), сохраните и закройте файл. Выполнено!
Миниатюрное руководство по Vim (или, как выполнить перебазирование всего 8 нажатиями клавиш 3jcwrEscZZ):
Запускаем vimtutor если есть время
hjkl соответствуют клавишам перемещения ← ↓ ↑ →
Все команды могут иметь префикс "диапазон", например 3j перемещается на три строчки вниз
i для входа в режим вставки - вводимый вами текст появится в файле
Esc или Ctrlc для выхода из режима вставки и возврата в "нормальный" режим.
ты отменить
Ctrlr, чтобы повторить
dd, dw, dl для удаления строки, слова или буквы соответственно
cc, cw, cl для изменения строки, слова или буквы соответственно (то же, что и ddi)
yy, yw, yl для копирования ("восстановления") строки, слова или буквы соответственно
p или P для вставки после или до текущей позиции, соответственно
: wEnter, чтобы сохранить (записать) файл
: q! Enter для выхода без сохранения
: wqEnter или ZZ для сохранения и выхода
Если вы много редактируете текст, переключитесь на раскладку клавиатуры Дворжака, научитесь печатать вслепую и изучите Vim. Стоит ли прилагать усилия? Да.
ProTip ™: не бойтесь экспериментировать с «опасными» командами, которые перезаписывают историю * - Git по умолчанию не удаляет ваши коммиты в течение 90 дней; вы можете найти их в рефлоге:
$ git reset @ ~ 3 # Вернуться на три коммита
$ git reflog
c4f708b HEAD @ {0}: reset: переход на @ ~ 3
2c52489 HEAD @ {1}: commit: дополнительные изменения
4a5246d HEAD @ {2}: commit: внести важные изменения
e8571e4 HEAD @ {3}: commit: внести некоторые изменения
... более ранние коммиты ...
$ git сбросить 2c52489
... и вы вернулись туда, откуда начали
* Остерегайтесь таких опций, как --hard и --force - они могут отбрасывать данные.
* Кроме того, не переписывайте историю веток, над которыми вы работаете.
|
Исправить
У вас есть параварианты здесь. Ты можешь сделать
git commit --amend
пока это ваша последняя фиксация.
Интерактивное перебазирование
В противном случае, если это не ваша последняя фиксация, вы можете выполнить интерактивную перебазировку,
git rebase -i [branch_from] [хеш перед фиксацией]
Затем внутри интерактивного перебазирования вы просто добавляете правку в этот коммит. Когда он появится, выполните команду git commit --amend и измените сообщение фиксации. Если вы хотите откатиться до этой точки фиксации, вы также можете использовать git reflog и просто удалить эту фиксацию. Затем вы снова делаете коммит git.
|
Если вы используете графический интерфейс Git, вы можете изменить последний коммит, который не был отправлен, с помощью:
Фиксация / изменение последней фиксации
|
Я использую графический интерфейс Git как можно чаще, и это дает вам возможность изменить последний коммит:
Кроме того, git rebase -i origin / master - это хорошая мантра, которая всегда будет представлять вам коммиты, которые вы сделали поверх master, и дает вам возможность изменить, удалить, изменить порядок или сквош. Не нужно сначала добывать этот хеш.
|
Ух ты, есть много способов сделать это.
Еще один способ сделать это - удалить последний коммит, но сохранить его изменения, чтобы не потерять свою работу. Затем вы можете сделать еще одну фиксацию с исправленным сообщением. Это выглядело бы примерно так:
git reset - мягкая ГОЛОВКА ~ 1
git commit -m 'Новое и исправленное сообщение фиксации'
Я всегда так делаю, если забываю добавить файл или внести изменения.
Не забудьте указать --soft вместо --hard, иначе вы полностью потеряете эту фиксацию.
|
Для тех, кто ищет графический интерфейс Windows / Mac для редактирования старых сообщений (то есть не только последних сообщений), я бы порекомендовал Sourcetree. Следующие шаги приведены под изображением.
Для коммитов, которые еще не были отправлены на удаленный компьютер:
Убедитесь, что вы зафиксировали или сохранили все текущие изменения (т.е. на вкладке «Статус файла» нет файлов) - иначе это не сработает.
На вкладке «Журнал / История» щелкните правой кнопкой мыши запись с прилегающей линией на графике под коммитами, которые вы хотите отредактировать, и выберите «Перебазировать дочерние элементы  в интерактивном режиме ...»
Выделите всю строку для сообщения фиксации, которое вы хотите изменить (щелкните столбец «Сообщение»).
Нажмите кнопку «Редактировать сообщение».
Отредактируйте сообщение в появившемся диалоговом окне и нажмите OK.
Повторите шаги 3-4, если нужно изменить другие сообщения фиксации.
Нажмите ОК: начнется изменение базы. Если все в порядке, вывод будет завершен «Завершено успешно». ПРИМЕЧАНИЕ: я иногда видел, что это не удается с невозможностью создать 'project_path / .git / index.lock': файл существует. при попытке изменить несколько сообщений фиксации одновременно. Не уверен, в чем именно заключается проблема, и будет ли она исправлена ​​в будущей версии Sourcetree, но если это произойдет, я бы рекомендовал переустанавливать их по одному (медленнее, но кажется более надежным).
... Или ... для уже отправленных коммитов:
Выполните шаги, описанные в этом ответе, которые аналогичны приведенным выше, но для принудительного нажатия ветки требуется выполнить дополнительную команду из командной строки (git push origin  -f). Я бы рекомендовал прочитать все это и проявить необходимую осторожность!
|
Если вы просто хотите отредактировать последний коммит, используйте:
git commit --amend
или
git commit --amend -m 'однострочное сообщение'
Но если вы хотите редактировать несколько коммитов подряд, вам следует вместо этого использовать ребазинг:
git rebase -i <хеш одного коммита перед неправильным коммитом>
В файле, подобном приведенному выше, напишите edit / e или один из других параметров и нажмите «Сохранить» и выйти.
Теперь вы попадете в первую ошибочную фиксацию. Внесите изменения в файлы, и они будут автоматически перенесены за вас. Тип
git commit --amend
Сохраните и выйдите из этого и введите
git rebase - продолжить
чтобы перейти к следующему выбору, пока не закончите со всеми вашими выборами.
Обратите внимание, что эти вещи изменяют все ваши хэши SHA после этого конкретного коммита.
|
Если вы хотите изменить только последнее сообщение, вам следует использовать флаг --only или его ярлык -o с commit --amend:
git commit --amend -o -m "Новое сообщение фиксации"
Это гарантирует, что вы случайно не улучшите свой коммит с помощью постановочного материала. Конечно, лучше иметь правильную конфигурацию $ EDITOR. Затем вы можете не указывать параметр -m, и Git предварительно заполнит сообщение фиксации старым сообщением. Таким образом его можно легко редактировать.
|
Обновите последнее ошибочное сообщение о фиксации новым сообщением о фиксации в одной строке:
git commit --amend -m "ваше новое сообщение фиксации"
Или попробуйте сбросить Git, как показано ниже:
# Вы можете сбросить голову на n количество коммитов
# НЕ хорошая идея для изменения сообщения последнего коммита,
# но вы можете разделить коммит на несколько коммитов
git reset - мягкая ГОЛОВКА ^
# Это сбросит вашу последнюю фиксацию. Теперь ваша очередь
# может повторно зафиксировать его с новым сообщением фиксации.
Использование сброса для разделения коммитов на более мелкие коммиты
git reset также может помочь вам разбить одну фиксацию на несколько коммитов:
# Перезагрузите голову. Я возвращаюсь к последним коммитам:
git reset - мягкая ГОЛОВКА ^
# (Вы можете сбросить множественные коммиты, выполнив HEAD ~ 2 (количество коммитов)
# А теперь верни головуразделение на несколько коммитов
git сбросить HEAD
# Добавьте и зафиксируйте свои файлы отдельно, чтобы сделать несколько коммитов: например
git добавить приложение /
git commit -m "добавить все файлы в каталог приложения"
git добавить config /
git commit -m "добавить все файлы в каталог конфигурации"
Здесь вы успешно разбили свою последнюю фиксацию на две фиксации.
|
На этот вопрос есть много ответов, но ни один из них не объясняет очень подробно, как изменить старые сообщения фиксации с помощью Vim. Я застрял, пытаясь сделать это сам, поэтому здесь я подробно опишу, как я это сделал, специально для людей, у которых нет опыта в Vim!
Я хотел изменить свои пять последних коммитов, которые я уже отправил на сервер. Это довольно «опасно», потому что, если кто-то уже сделал это, вы можете все испортить, изменив сообщения фиксации. Однако, если вы работаете над своей маленькой веткой и уверены, что ее никто не потянул, вы можете изменить ее следующим образом:
Допустим, вы хотите изменить свои пять последних коммитов, а затем набираете это в терминале:
git rebase -i HEAD ~ 5
* Где 5 - это количество сообщений фиксации, которые вы хотите изменить (поэтому, если вы хотите изменить 10-е на последнюю фиксацию, введите 10).
Эта команда приведет вас в Vim, где вы сможете «редактировать» историю коммитов. Вы увидите свои последние пять коммитов вверху следующим образом:
выберите  сообщение фиксации
Вместо пика нужно написать пересказ. Вы можете сделать это в Vim, набрав i. Это заставляет вас перейти в режим вставки. (Вы видите, что находитесь в режиме вставки по слову INSERT внизу.) Для коммитов, которые вы хотите изменить, введите reword вместо pick.
Затем вам нужно сохранить и закрыть этот экран. Для этого сначала войдите в «командный режим», нажав клавишу Esc (вы можете убедиться, что находитесь в командном режиме, если слово ВСТАВИТЬ внизу исчезло). Затем вы можете ввести команду, набрав:. Команда для сохранения и выхода - wq. Итак, если вы наберете: wq, вы на правильном пути.
Затем Vim будет просматривать каждое сообщение фиксации, которое вы хотите перефразировать, и здесь вы можете фактически изменить сообщения фиксации. Вы сделаете это, перейдя в режим вставки, изменив сообщение фиксации, войдя в командный режим, сохранив и выйдя. Повторите это пять раз, и Vim закончится!
Затем, если вы уже отправили неправильные коммиты, вам нужно git push --force перезаписать их. Помните, что git push --force - довольно опасная вещь, поэтому убедитесь, что никто не снимал с сервера, так как вы отправили неправильные коммиты!
Теперь вы изменили сообщения коммитов!
(Как видите, у меня нет опыта работы с Vim, поэтому, если я использовал неправильный «жаргон», чтобы объяснить, что происходит, не стесняйтесь меня поправлять!)
|
Вы можете использовать git-rebase-reword
Он предназначен для редактирования любой фиксации (не только последней) так же, как commit --amend
$ git rebase-reword 
Он назван в честь интерактивного действия rebase для изменения фиксации: "reword". См. Этот пост и интерактивный режим man -section-
Примеры:
$ git rebase-reword b68f560
$ git rebase-reword HEAD ^
|
Я добавил псевдонимы reci и recm для повторного подтверждения (исправления). Теперь я могу сделать это с помощью git recm или git recm -m:
$ vim ~ / .gitconfig
[псевдоним]
......
cm = совершить
reci = commit --amend
recm = commit --amend
......
|
Я понял, что отправил коммит с опечаткой. Для отмены я сделал следующее:
git commit --amend -m "Т-1000, расширенный прототип"
git push --force
Предупреждение: принудительное нажатие ваших изменений перезапишет удаленную ветку вашей локальной. Убедитесь, что вы не собираетесь перезаписывать все, что хотите сохранить. Также будьте осторожны при принудительном продвижении измененного (переписанного) коммита, если кто-то еще поделится с вами веткой, потому что им нужно будет переписать свою собственную историю, если у них есть старая копия коммита, которую вы только что переписали.
|
Мне нравится использовать следующее:
git статус
git add --all
git commit -am "сообщение об изменении"
git pull <мастер происхождения>
git push <мастер происхождения>
|
Если вы не отправили код в удаленную ветку (GitHub / Bitbucket), вы можете изменить сообщение фиксации в командной строке, как показано ниже.
git commit --amend -m "Ваше новое сообщение"
Если вы работаете над определенной веткой, сделайте следующее:
git commit --amend -m "НАЗВАНИЕ ФИЛИАЛА: новое сообщение"
Если вы уже отправили код с неправильным сообщением, и вам нужно быть осторожным при изменении сообщения. То есть после того, как вы измените сообщение фиксации и попытаетесь отправить его снова, у вас возникнут проблемы. Чтобы сделать его гладким, выполните следующие действия.
Пожалуйста, прочтите мой ответ полностью, прежде чем делать это.
git commit --amend -m "НАЗВАНИЕ ФИЛИАЛА: ваше новое сообщение"
git push -f origin BRANCH-NAME # Не лучшая практика. Читайте ниже почему?
Важное примечание: когда вы используете принудительное нажатие напрямую, вы можете столкнуться с проблемами кода, которые другие разработчики работают над той же веткой. Поэтому, чтобы избежать этих конфликтов, вам нужно вытащить код из своей ветки, прежде чем применять силуОт себя:
git commit --amend -m "НАЗВАНИЕ ФИЛИАЛА: ваше новое сообщение"
git pull origin ИМЯ ФИЛИАЛА
git push -f origin НАЗВАНИЕ ОТДЕЛЕНИЯ
Это лучший способ изменить сообщение фиксации, если оно уже было отправлено.
|
Не тот ответ, который вы ищете? Просмотрите другие вопросы с меткой git git-commit git-rewrite-history identify или задайте свой вопрос.